package ar.edu.sovietrussia;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.classic.Session;
import org.hibernate.criterion.Restrictions;

import persistenciatest.SessionManager;
import utils.Pair;

public class EquipoHome {
	private boolean cacheable = true;

	public Equipo getEquipoByName(String equipoName){
		Session session = SessionManager.getInstance().getSession();
		Criteria query = session.createCriteria(Equipo.class).add(Restrictions.eq("nombre", equipoName));
		query.setCacheable(cacheable);
		return (Equipo) query.uniqueResult();

	}
	
	public void storeEquipo(Equipo anEquipo){
		Session session = SessionManager.getInstance().getSession();
		session.save(anEquipo);
	}
	public void remove(Equipo anEquipo){
		Session session = SessionManager.getInstance().getSession();
		session.delete(anEquipo);
	}
	
	public List<Equipo> findAll(){
		Session session = SessionManager.getInstance().getSession();
		Query query = session.createQuery("from Equipo");
		
		query.setCacheable(cacheable);
		List<Equipo> result = query.list();
		
		return result;
	}
	
	public List<Pair<Equipo, Integer>>rankingGanadoresPartidoDeCopa(){
		Session session = SessionManager.getInstance().getSession();
		Query query = session.createQuery(
				"select p.ganador " +
				"from PartidoDeCopa as p" 
				);
		query.setCacheable(cacheable);
		List<Equipo> result = query.list();
		List<Equipo> totalEquipos = this.findAll();
		
		List<Pair<Equipo, Integer>> ranking = new ArrayList<Pair<Equipo, Integer>>();
		
		for (Equipo e : totalEquipos){
			int puntos = Collections.frequency(result, e);
			ranking.add(new Pair(e, puntos));
		}
		Collections.sort(ranking, new Comparator<Pair<Equipo, Integer>>(){

			public int compare(Pair<Equipo, Integer> o1,
					Pair<Equipo, Integer> o2) {
				if (o1.getSecond() > o2.getSecond()){
					return -1;
				}
				if (o1.getSecond() < o2.getSecond()){
					return 1;
				}
				return 0;
			}});
		
		return ranking;
	}
}
